package tec;

public class Autobus extends Bus implements Transport {

    //La classe Autobus implémente la classe JaugeNaturel
    private int nb_place;
    private JaugeNaturel debout;
    private JaugeNaturel assis;
    private int numeroArret;
    private Passager[] passagers;
    
    public Autobus (int nbPlaceAssise, int nbPlaceDebout) {
   
	debout = new JaugeNaturel(0,nbPlaceDebout,0);
        assis = new JaugeNaturel(0,nbPlaceAssise,0);
        passagers = new Passager[nbPlaceAssise + nbPlaceDebout + 1];
	nb_place = nbPlaceAssise + nbPlaceDebout;
	
    }
    
    public boolean aPlaceAssise() {
	
	return assis.estVert();
    }
    
    public boolean aPlaceDebout() {
	return debout.estVert();
    }
    
    
    void demanderPlaceAssise(Passager p)
    {
        if (aPlaceAssise())
            {
		int i=1;
		while (passagers[i]!=null)
		    {
			i++;
		    }
		passagers[i] = p;
                assis.incrementer();
                p.accepterPlaceAssise();
            }
    }
   
    void demanderPlaceDebout(Passager p)
    {
        if(aPlaceDebout())
            {
		int i=1;
		while (passagers[i]!=null)
		    {
			i++;
		    }
                passagers[i] = p;
                debout.incrementer();
                p.accepterPlaceDebout();
            }
    }



    void demanderSortie(Passager p)
    {
	/*Recherche de la place du passager p dans le tableau des passagers	*/
        int i = 1;
        while (i < nb_place && p != passagers[i])
            {
                i++;
            }


	/*On déplace la position du passager afin de pouvoir le retirer du tableau des passagers grâce au ramasse miettes.*/
	
	passagers[i]=null;

        if ( p.estAssis() )
            {
                assis.decrementer();
            }
        else if (p.estDebout())
            {
                debout.decrementer();
            }

        p.accepterSortie();
    }
    
    void demanderChangerEnAssis(Passager p) {
	if (aPlaceAssise()) {
	    assis.incrementer();
	    debout.decrementer();
	    p.accepterPlaceAssise();
	}
    }
    
    void demanderChangerEnDebout(Passager p) {
	if (aPlaceDebout()) {
	    assis.decrementer();
	    debout.incrementer();
	    p.accepterPlaceDebout();
	}
    }
        
    public void allerArretSuivant() { 

	numeroArret ++;
        for (int i = 1; i <= nb_place ; i++)
            {
		if (passagers[i]!=null)
		    passagers[i].nouvelArret(this,this.numeroArret);
            }
    }


    @Override
	public String toString() {
	return "[arret:" + this.numeroArret + ", assis:" + this.assis + ", debout:" + this.debout + "]";
    }

}		
